iT邦幫忙

2024 iThome 鐵人賽

DAY 15
1
DevOps

菜逼八用Github Actions系列 第 15

Day 15 - 簡單例子 - 幫PR上標籤

  • 分享至 

  • xImage
  •  

目錄

摘要

在上一篇我們了解了撰寫 workflow 前需要做的permission設定,以及GITHUB_TOKEN跟workflow permission的關係

這篇我們會來會認識另一個action,並用它來寫一個簡單的幫PR上label的workflow

workflow的基本結構

開始之前來複習一下workflow的基本結構

寫workflow是為了叫 Github Actions提供的runner幫你在某些時候,自動做一些有固定流程、順序,而且你懶得每次都自己處理的事情

我們可以用英文的5W1H來記住workflow的基本結構

// 以下三項很明確,所以不需要在寫進yml檔裡
Where: Github Actions
Who: runner
Why: 你懶得每次都自己處理

// 以下是你要寫進yml檔裡的,這樣runner才會知道你要他在何時幫你做什麼
When: 某些時候,透過on定義
What: 固定流程、順序的事,透過jobs、steps定義
How: 事情的細節,透過run、use定義

不過如果記不起來或者是有其他更複雜的需求,也可以在直接使用官方跟社群提供的template

https://ithelp.ithome.com.tw/upload/images/20240830/20135568wwLeNHzLup.png
https://ithelp.ithome.com.tw/upload/images/20240830/20135568zgMl56RJZ2.png

template裡面也有註解,不用擔心看不懂
https://ithelp.ithome.com.tw/upload/images/20240830/201355687Z4U687fpl.png

使用label管理PR的好處

大家應該在各大repo的Pull Request區看過label

https://ithelp.ithome.com.tw/upload/images/20240830/20135568oORXfoeD2P.png
https://ithelp.ithome.com.tw/upload/images/20240830/201355686kwrzzxxHQ.png

幫PR上label的好處如下

1.方便管理PR

  • 快速分類
  • 簡化搜尋

2.作為workflow內條件判斷的依據

  • 根據label決定要自動部署、還是自動測試

步驟

actions/labeler@v5是一個可以根據你設定的條件幫PR自動上label的action

在.github下建立labeler.yml

# 以main為base開出去的分支名稱以fix/開頭且後面只含英文、-、_時,使用fix label
bug:
  - base-branch: ['main']
  - head-branch: ['^fix/[a-zA-Z_-]+']

# 如果更動的檔案有.md檔,使用documentation標籤
documentation:
  - changed-files:
    - any-glob-to-any-file: ['*.md']

# 如果更動的檔案有src底下任一資料夾的檔案,且該檔案不在src下的docs資料夾內的話,使用source標籤
source:
  - changed-files:
    - any-glob-to-any-file: 'src/**/*'
    # !代表排除之意
    - all-globs-to-all-files: '!src/docs/*'

從上面的例子可以注意到changed filed的屬性不只一種

由any和all取任兩個排列組合組成,一共有四種屬性如下

  • any-glob-to-any-file

    • 任何一個pattern,match到任何檔案
      - any-glob-to-any-file: ['*.md', '*.txt', '*.csv']
      
      # 更動的檔案為index.md、inddex.js時,因為有1個pattern match到1個檔案到故成立
      
  • any-glob-to-all-files

    • 任何一個pattern,match到所有檔案
      - any-glob-to-all-file: ['*.md', '*.txt', '*.csv']
      
      # 更動的檔案為index.md、template.md時,因為有1個pattern match所有檔案到故成立
      
  • all-globs-to-any-file

    • 所有attern,match到任何檔案
      - all-globs-to-any-file: ['*.md', 'doc/*.*']
      
      # 更動的檔案為doc/index.md、main.js時,因為所有pattern match到1個檔案故成立
      
  • all-globs-to-all-files

    • 所有pattern,match到所有檔案
      - all-globs-to-all-files: ['*.md', '*.txt', '*.csv']
      
      # 更動的檔案為index.md、index.txt、template.csv時,因為所有pattern都有match到檔案,且所有檔案都有被某個patternmatch到故成立
      

在.github/workflows下建立yml檔

這一步可以使用官方給的範例,或者以範例為基礎進行修改

name: Add label to PR

on:
  pull_request:
    branches:
      - main

jobs:
  labeler:
    permissions:
      contents: read
      # 一定要賦予workflow PR的wirte權限才能上label
      # 如果你的repo是從別的repo form產生的,則預設只會有PR的read權限,此時就須要把on底下的事件改用pull_request_target
      pull-requests: write
    runs-on: ubuntu-latest
    steps:
    - uses: actions/labeler@v5
      # with為optional屬性,透過它可以傳入各種input
      with:
        # 當更動的檔案改變時,且不再match時,移除label
        sync-labels: true
  

上一篇
Day14 - 撰寫第一個workflow的前置工作
下一篇
Day 16 - 複用workflow (上)
系列文
菜逼八用Github Actions30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言